// **************************************************************
// COPYRIGHT(c)2016, Xidian University
// All rights reserved.
//
// IP LIB INDEX :  
// IP Name      :      
// File name    :  
// Module name  :  
// Full name    :  
// Time         : 2016 
// Author       : Wang-Weina 
// Email        : 327422289@qq.com
// Data         : 
// Version      : V 1.0 
// 
// Abstract     :
// Called by    :  
// 
// Modification history
// -----------------------------------------------------------------
// 
// 
//
// *****************************************************************

// *******************
// TIMESCALE
// ******************* 
`timescale 1ns/1ps 
`include "top_define.v"
// *******************
// INFORMATION
// *******************

//*******************
//DEFINE(s)
//*******************
//`define UDLY 1    //Unit delay, for non-blocking assignments in sequential logic

//*******************
//DEFINE MODULE PORT
//*******************
module rbve_1
   // #(
   //  parameter RULE_O  = 5
   //  )
   (
    input wire clk,
    input wire rst_n,
    input wire [11:0]ram_dp_cfg_register,
    input wire[7:0] range_first,
    input wire lookup_en,
    input wire[ 7:0] addr_loc,
    // input wire[ 8:0] addr_loc,
    input wire[95:0] cpu_data,
    output reg[95:0] cpu_data_o_ff,
    input wire mod_en,
    output reg[2:0] rbve_out_r0 ,
    output reg[2:0] rbve_out_r1 ,
    output reg[2:0] rbve_out_r2 ,
    output reg[2:0] rbve_out_r3 ,
    output reg[2:0] rbve_out_r4 ,
    output reg[2:0] rbve_out_r5 ,
    output reg[2:0] rbve_out_r6 ,
    output reg[2:0] rbve_out_r7 ,
    output reg[2:0] rbve_out_r8 ,
    output reg[2:0] rbve_out_r9 ,
    output reg[2:0] rbve_out_r10,
    output reg[2:0] rbve_out_r11,
    output reg[2:0] rbve_out_r12,
    output reg[2:0] rbve_out_r13,
    output reg[2:0] rbve_out_r14,
    output reg[2:0] rbve_out_r15,
    output reg[2:0] rbve_out_r16,
    output reg[2:0] rbve_out_r17,
    output reg[2:0] rbve_out_r18,
    output reg[2:0] rbve_out_r19,
    output reg[2:0] rbve_out_r20,
    output reg[2:0] rbve_out_r21,
    output reg[2:0] rbve_out_r22,
    output reg[2:0] rbve_out_r23,
    output reg[2:0] rbve_out_r24,
    output reg[2:0] rbve_out_r25,
    output reg[2:0] rbve_out_r26,
    output reg[2:0] rbve_out_r27,
    output reg[2:0] rbve_out_r28,
    output reg[2:0] rbve_out_r29,
    output reg[2:0] rbve_out_r30,
    output reg[2:0] rbve_out_r31

);

//*******************
//DEFINE LOCAL PARAMETER
//*******************
//parameter(s)

//*********************
//INNER SIGNAL DECLARATION
//*********************
//REGS
    
reg[7:0] addra;
reg lookup_en_ff1,lookup_en_ff2;
//WIRES
wire[95:0] douta;
wire[95:0] cpu_data_o;

reg [95:0] douta_ff;
//*********************
//INSTANTCE MODULE
//*********************
`ifdef ASIC //2021/8/28
reg cena,cenb;
ram_dp_d256_w96_wrapper U1_asic( // 2022.5.9, xym
    .clka(clk),
    .clkb(clk),
    .ram_dp_cfg_register(ram_dp_cfg_register),
    .wea(1'b0),
    .addra(addra),
    .dina(96'b0),
    .douta(douta), //\u8bfb

    .cena(cena),
    .cenb(cenb),

    .web(mod_en),
    .addrb(addr_loc),
    .dinb(cpu_data),
    .doutb(cpu_data_o)
);

// ram_dp_d512_w96_wrapper U1_asic(
//     .clka(clk),
//     .clkb(clk),
//     .ram_dp_cfg_register(ram_dp_cfg_register),
//     .wea(1'b0),
//     .addra(addra),
//     .dina(96'b0),
//     .douta(douta), //\u8bfb

//     .cena(cena),
//     .cenb(cenb),

//     .web(mod_en),
//     .addrb(addr_loc),
//     .dinb(cpu_data),
//     .doutb(cpu_data_o)
// );

always@(*)begin
    if(mod_en && (addra == 8'b0))begin
        cena = 1'b1;
        cenb = 1'b0;
    end
    else begin
        cena = 1'b0;
        cenb = 1'b0;
    end
end

`else
//FPGA
bram_36K U1(
    .clka(clk),
    .rst_n(rst_n),
    .addra(addra),
    .douta(douta), //\u8bfb
                    
    .wr_en(mod_en),
    .addrb(addr_loc),
    .dinb(cpu_data),
    .doutb(cpu_data_o)  
    );
`endif
// //ASIC \u4e3e\u4f8b
// bram_36K U1(
//     .clka (clk       ),
//     .clkb (clk       ),
// //\u67e5\u627e\u8bbf\u95ee   
//     .wea  (1'b0      ),
//     .addra(addra     ),
//     .dina (96'b0     ),
//     .douta(douta     ),
// //cpu\u914d\u7f6e\u8bfb\u53d6\u8bbf\u95ee\u63a5\u53e3   
//     .web  (mod_en    ),
//     .addrb(addr_loc  ),
//     .dinb (cpu_data  ),
//     .doutb(cpu_data_o)  
//     ); 

//*********************
//MAIN CORE
//********************* 
always@(*)
  begin
    if(~rst_n)
      addra = 8'b0;
    else if(lookup_en)
      begin
         addra = range_first;
      end
    else 
      begin
          addra = 8'b0;
      end
  end

always@(posedge clk or negedge rst_n)
  begin
    if(~rst_n)begin
      lookup_en_ff1 <= 0;
      lookup_en_ff2 <= 0;
    end
    else begin
      lookup_en_ff1 <= lookup_en;
      lookup_en_ff2 <= lookup_en_ff1;
    end
  end

always@(posedge clk or negedge rst_n)
  begin
    if(~rst_n)begin
      douta_ff      <= 0;
      cpu_data_o_ff <= 0;
    end
    else begin
      douta_ff      <= douta;
      cpu_data_o_ff <= cpu_data_o;
    end
  end

always@(posedge clk or negedge rst_n)
  begin
    if(~rst_n)
      begin
        rbve_out_r0   <=3'b0;
        rbve_out_r1   <=3'b0;
        rbve_out_r2   <=3'b0;
        rbve_out_r3   <=3'b0;
        rbve_out_r4   <=3'b0;
        rbve_out_r5   <=3'b0;
        rbve_out_r6   <=3'b0;
        rbve_out_r7   <=3'b0;
        rbve_out_r8   <=3'b0;
        rbve_out_r9   <=3'b0;
        rbve_out_r10  <=3'b0;
        rbve_out_r11  <=3'b0;
        rbve_out_r12  <=3'b0;
        rbve_out_r13  <=3'b0;
        rbve_out_r14  <=3'b0;
        rbve_out_r15  <=3'b0;
        rbve_out_r16  <=3'b0;
        rbve_out_r17  <=3'b0;
        rbve_out_r18  <=3'b0;
        rbve_out_r19  <=3'b0;
        rbve_out_r20  <=3'b0;
        rbve_out_r21  <=3'b0;
        rbve_out_r22  <=3'b0;
        rbve_out_r23  <=3'b0;
        rbve_out_r24  <=3'b0;
        rbve_out_r25  <=3'b0;
        rbve_out_r26  <=3'b0;
        rbve_out_r27  <=3'b0;
        rbve_out_r28  <=3'b0;
        rbve_out_r29  <=3'b0;
        rbve_out_r30  <=3'b0;
        rbve_out_r31  <=3'b0;
      end
    else if(lookup_en_ff2)  //\u62532\u62cd\u7b49\u5f85ram\u8bfb\u7ed3\u679c
      begin
        rbve_out_r0   <=douta_ff[95:93];
        rbve_out_r1   <=douta_ff[92:90];
        rbve_out_r2   <=douta_ff[89:87];
        rbve_out_r3   <=douta_ff[86:84];
        rbve_out_r4   <=douta_ff[83:81];
        rbve_out_r5   <=douta_ff[80:78];
        rbve_out_r6   <=douta_ff[77:75];
        rbve_out_r7   <=douta_ff[74:72];
        rbve_out_r8   <=douta_ff[71:69];
        rbve_out_r9   <=douta_ff[68:66];
        rbve_out_r10  <=douta_ff[65:63];
        rbve_out_r11  <=douta_ff[62:60];
        rbve_out_r12  <=douta_ff[59:57];
        rbve_out_r13  <=douta_ff[56:54];
        rbve_out_r14  <=douta_ff[53:51];
        rbve_out_r15  <=douta_ff[50:48];
        rbve_out_r16  <=douta_ff[47:45];
        rbve_out_r17  <=douta_ff[44:42];
        rbve_out_r18  <=douta_ff[41:39];
        rbve_out_r19  <=douta_ff[38:36];
        rbve_out_r20  <=douta_ff[35:33];
        rbve_out_r21  <=douta_ff[32:30];
        rbve_out_r22  <=douta_ff[29:27];
        rbve_out_r23  <=douta_ff[26:24];
        rbve_out_r24  <=douta_ff[23:21];
        rbve_out_r25  <=douta_ff[20:18];
        rbve_out_r26  <=douta_ff[17:15];
        rbve_out_r27  <=douta_ff[14:12];
        rbve_out_r28  <=douta_ff[11: 9];
        rbve_out_r29  <=douta_ff[ 8: 6];
        rbve_out_r30  <=douta_ff[ 5: 3];
        rbve_out_r31  <=douta_ff[ 2: 0];
      end
    else 
        begin
        rbve_out_r0   <=3'b0;
        rbve_out_r1   <=3'b0;
        rbve_out_r2   <=3'b0;
        rbve_out_r3   <=3'b0;
        rbve_out_r4   <=3'b0;
        rbve_out_r5   <=3'b0;
        rbve_out_r6   <=3'b0;
        rbve_out_r7   <=3'b0;
        rbve_out_r8   <=3'b0;
        rbve_out_r9   <=3'b0;
        rbve_out_r10  <=3'b0;
        rbve_out_r11  <=3'b0;
        rbve_out_r12  <=3'b0;
        rbve_out_r13  <=3'b0;
        rbve_out_r14  <=3'b0;
        rbve_out_r15  <=3'b0;
        rbve_out_r16  <=3'b0;
        rbve_out_r17  <=3'b0;
        rbve_out_r18  <=3'b0;
        rbve_out_r19  <=3'b0;
        rbve_out_r20  <=3'b0;
        rbve_out_r21  <=3'b0;
        rbve_out_r22  <=3'b0;
        rbve_out_r23  <=3'b0;
        rbve_out_r24  <=3'b0;
        rbve_out_r25  <=3'b0;
        rbve_out_r26  <=3'b0;
        rbve_out_r27  <=3'b0;
        rbve_out_r28  <=3'b0;
        rbve_out_r29  <=3'b0;
        rbve_out_r30  <=3'b0;
        rbve_out_r31  <=3'b0;
      end    
  end
//*********************
endmodule    // hookup byte controller block

